package controllers

import (
	"crmObject/models"
	"crmObject/util"
	"encoding/json"
	"fmt"
	"github.com/astaxie/beego"
	"github.com/astaxie/beego/orm"
	"github.com/gomodule/redigo/redis"
	"strconv"
)

type SalesOrdersController struct {
	beego.Controller
}

var salesOrder models.SalesOrders
var salesOrders []models.SalesOrders
var customer models.Customers

//关键字查询订单

//func (c *SalesOrdersController) KeyWordSelectSalesOrders() {
//	// 在进入每个页面之前进行登录状态的判断
//	if !IsUserLoggedIn() {
//		c.Redirect("/login", 302) // 未登录则重定向到登录页面
//	}
//	err := json.Unmarshal(c.Ctx.Input.RequestBody, &salesOrder)
//	if err != nil {
//		fmt.Println(err)
//		errCode := 504
//		newError := util.NewError(errCode)
//		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
//		c.ServeJSON()
//		return
//	}
//	CustomerName := salesOrder.Customers.CustomerName
//	ServiceName := salesOrder.Services.ServiceName
//
//	newOrm := orm.NewOrm()
//	//通过输入的客户名称或服务名称,获取id给其作为外键条件
//	if CustomerName != "" {
//		err = newOrm.QueryTable(&customer).Filter("customer_name__contains", CustomerName).One(&customer)
//		if err != nil {
//			fmt.Println(err)
//			errCode := 505
//			newError := util.NewError(errCode)
//			c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
//			c.ServeJSON()
//			return
//		}
//		salesOrder.Customers = &customer
//	}
//	if ServiceName != "" {
//		err = newOrm.QueryTable(&service).Filter("service_name__contains", ServiceName).One(&service)
//		if err != nil {
//			fmt.Println(err)
//			errCode := 505
//			newError := util.NewError(errCode)
//			c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
//			c.ServeJSON()
//			return
//		}
//		salesOrder.Services = &service
//	}
//
//	//TODO 没有查询到结果
//	if CustomerName == "" && ServiceName == "" {
//		fmt.Println(err)
//		errCode := 505
//		newError := util.NewError(errCode)
//		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
//		c.ServeJSON()
//		return
//	} else if CustomerName != "" {
//		if ServiceName != "" {
//			//两个都存在--------------------------------------------------------------------------------------service表下的service_name
//			_, err = newOrm.QueryTable(&salesOrder).Filter("customers", salesOrder.Customers.CustomerID).Filter("services", salesOrder.Services.ServiceID).RelatedSel().All(&salesOrders)
//		} else {
//			//客户名称搜索
//			_, err = newOrm.QueryTable(&salesOrder).Filter("customers", salesOrder.Customers.CustomerID).RelatedSel().All(&salesOrders)
//			if err != nil {
//				fmt.Println(err)
//				errCode := 500
//				newError := util.NewError(errCode)
//				c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
//				c.ServeJSON()
//				return
//			}
//		}
//	} else {
//		//客户名称为空,搜索服务名称
//		_, err = newOrm.QueryTable(&salesOrder).Filter("services", salesOrder.Services.ServiceID).RelatedSel().All(&salesOrders)
//	}
//	//虚假数据
//	pagination := util.NewPagination(4, 1, util.PAGESIZE)
//	c.Data["page"] = pagination
//
//	c.Data["salesOrders"] = salesOrders
//	c.TplName = "salesorderstables.html"
//	//这里可以直接返回已经渲染好的页面的代码给ajax的data
//}

//查询单条要修改的数据

func (c *SalesOrdersController) SelectUpdateSalesOrders() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &salesOrder)
	if err != nil {
		fmt.Println(err)
		errCode := 504
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	newOrm := orm.NewOrm()
	err = newOrm.QueryTable(&salesOrder).Filter("order_i_d", salesOrder.OrderID).RelatedSel().One(&salesOrder)
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	c.Data["json"] = map[string]interface{}{
		"OrderName":    salesOrder.OrderName,
		"PlayStatic":   salesOrder.PlayStatic,
		"OrdersMoney":  salesOrder.OrdersMoney,
		"OrderStatus":  salesOrder.OrderStatus,
		"CustomerName": salesOrder.Customers.CustomerName,
		"ServiceName":  salesOrder.Services.ServiceName,
	}
	c.ServeJSON()
}

//关键字查询

func (c *SalesOrdersController) SelectServiceSalesOrders() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &service)
	if err != nil {
		fmt.Println(err)
		errCode := 504
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	ServiceName := service.ServiceName
	ServiceStatus := service.ServiceStatus
	newOrm := orm.NewOrm()
	//TODO 没有查询到结果
	if ServiceName == "" && ServiceStatus == "" {
		fmt.Println(err)
		errCode := 505
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	} else if ServiceName != "" {
		if ServiceStatus != "" {
			//两个都存在
			_, err = newOrm.QueryTable(&service).Filter("service_name__contains", ServiceName).Filter("service_status__contains", ServiceStatus).RelatedSel().All(&services)
		} else {
			//服务名称搜索
			_, err = newOrm.QueryTable(&service).Filter("service_name__contains", ServiceName).RelatedSel().All(&services)
			if err != nil {
				fmt.Println(err)
				errCode := 500
				newError := util.NewError(errCode)
				c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
				c.ServeJSON()
				return
			}
		}
	} else {
		//服务名称为空,搜索状态
		_, err = newOrm.QueryTable(&service).Filter("service_status__contains", ServiceStatus).RelatedSel().All(&services)
		if err != nil {
			fmt.Println(err)
			errCode := 500
			newError := util.NewError(errCode)
			c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
			c.ServeJSON()
			return
		}
	}
	//虚假数据
	pagination := util.NewPagination(4, 1, util.PAGESIZE)
	c.Data["page"] = pagination

	c.Data["services"] = services
	c.TplName = "creteSalesOrdersTables.html"
	//这里可以直接返回已经渲染好的页面的代码给ajax的data
}

//进入创建订单页面

func (c *SalesOrdersController) ToSalesOrders() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	//当前页
	pageNoStr := c.GetString("pageNo")
	if pageNoStr == "" {
		//参数为空,错误处理
		//errCode := 505
		//newError := util.NewError(errCode)
		//c.Data["error"] = newError
		//c.TplName = "error.html"
		pageNoStr = "1"
	}
	pageNo, err := strconv.Atoi(pageNoStr)
	newOrm := orm.NewOrm()
	//总记录数
	totalPageCount, err := newOrm.QueryTable(&service).Count()
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["error"] = newError
		c.TplName = "error.html"
	}
	pagination := util.NewPagination(int(totalPageCount), pageNo, util.PAGESIZE)

	_, err = newOrm.QueryTable(&service).RelatedSel().Limit(util.PAGESIZE, (pageNo-1)*util.PAGESIZE).All(&services)
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["error"] = newError
		c.TplName = "error.html"
	}
	c.Data["services"] = services
	c.Data["page"] = pagination
	conn := util.RedisPool.Get()
	// 从 Redis 中读取 JSON 字符串
	userJSON, err := redis.String(conn.Do("GET", util.USERS))
	if err != nil {
		fmt.Println(err)
	}
	// 将 JSON 字符串反序列化为结构体
	err = json.Unmarshal([]byte(userJSON), &user)

	c.Data["user"] = user
	defer conn.Close()
	c.TplName = "creteSalesOrdersTables.html"
}

//生成新的订单(参数,客户姓名,本次的服务)

func (c *SalesOrdersController) AddSalesOrders() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &salesOrder)
	if err != nil {
		fmt.Println(err)
		errCode := 504
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	//通过客户名称查询对应的id形成customer表外键 TODO 前端可以直接给到id不需要名字
	//TODO 好像不在需要声明对应的结构体对象了,可以直接使用其他文件中的实例化对对象
	customer.CustomerName = salesOrder.Customers.CustomerName
	o := orm.NewOrm()
	err = o.Read(&customer, "CustomerName")
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	salesOrder.Customers = &customer
	salesOrder.OrderID = 0
	_, err = o.Insert(&salesOrder)
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	errCode := 200
	newError := util.NewError(errCode)
	c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
	c.ServeJSON()
}

//订单的数据修改

func (c *SalesOrdersController) UpdateSalesOrders() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &salesOrder)
	if err != nil {
		fmt.Println(err)
		errCode := 504
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	//通过客户名称查询对应的id形成customer表外键 TODO 前端可以直接给到id不需要名字
	//TODO 好像不在需要声明对应的结构体对象了,可以直接使用其他文件中的实例化对对象
	customer.CustomerName = salesOrder.Customers.CustomerName
	o := orm.NewOrm()
	err = o.Read(&customer, "CustomerName")
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	salesOrder.Customers = &customer
	_, err = o.Update(&salesOrder, "play_static", "orders_money", "order_name", "order_status", "Customers", "Services")
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	errCode := 200
	newError := util.NewError(errCode)
	c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
	c.ServeJSON()
}

//订单的删除

func (c *SalesOrdersController) DeleteSalesOrders() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &salesOrder)
	if err != nil {
		fmt.Println(err)
		errCode := 504
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	o := orm.NewOrm()
	_, err = o.Delete(&salesOrder)
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	errCode := 200
	newError := util.NewError(errCode)
	c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
	c.ServeJSON()
}

//订单列表查询

func (c *SalesOrdersController) ListSalesOrders() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	//当前页
	pageNoStr := c.GetString("pageNo")
	if pageNoStr == "" {
		//参数为空,错误处理
		//errCode := 505
		//newError := util.NewError(errCode)
		//c.Data["error"] = newError
		//c.TplName = "error.html"
		pageNoStr = "1"
	}
	pageNo, err := strconv.Atoi(pageNoStr)
	newOrm := orm.NewOrm()
	//总记录数
	totalPageCount, err := newOrm.QueryTable(&salesOrder).Count()
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["error"] = newError
		c.TplName = "error.html"
	}
	pagination := util.NewPagination(int(totalPageCount), pageNo, util.PAGESIZE)
	_, err = newOrm.QueryTable(&salesOrder).RelatedSel().Limit(util.PAGESIZE, (pageNo-1)*util.PAGESIZE).All(&salesOrders)
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["error"] = newError
		c.TplName = "error.html"
	}
	c.Data["salesOrders"] = salesOrders
	c.Data["page"] = pagination
	conn := util.RedisPool.Get()
	// 从 Redis 中读取 JSON 字符串
	userJSON, err := redis.String(conn.Do("GET", util.USERS))
	if err != nil {
		fmt.Println(err)
	}
	// 将 JSON 字符串反序列化为结构体
	err = json.Unmarshal([]byte(userJSON), &user)
	defer conn.Close()
	c.Data["user"] = user
	c.TplName = "salesorderstables.html"
}
